package com.lee.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    /**
     * 指定负载均衡算法
     * @return
     */
    @Bean
    public IRule rule() {
        /*
        Ribbon 自带的负载均衡算法
            RoundRobinRule(): 轮询算法
            RandomRule(): 随机算法
            AvailabilityFilteringRule(): 会先过滤由于多次访问故障而处于断路器跳闸状态的服务，
                    还有并发的连接数量超过阈值的服务，然后对剩余的服务列表按照轮询策略进行访问
            WeightedResponseTimeRule(): 加权随机，根据平均响应的时间计算所有服务的权重，响应时间越快服务权重越大被选中的概率越高，
                    刚启动时如果统计信息不足，则使用RoundRobinRule策略，等统计信息足够会切换到WeightedResponseTimeRule
            RetryRule(): 先按照RoundRobinRule的策略获取服务，如果获取失败则在制定时间内进行重试，获取可用的服务
            BestAviableRule(): 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务
            ZoneAvoidanceRule(): 默认规则，复合判断server所在区域的性能和server的可用性选择服务器
         */
        return new RandomRule();
    }

}
